<?php
/***************************************************************
*  Copyright notice
*
*  (c) 2011 Florian Müller <it-admin@ifp-potsdam.co>, IFP
*  
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 3 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

/**
 * Controller for the Anmeldung object
 */
class Tx_IfpCurriculum2_Controller_AnmeldungController extends Tx_Extbase_MVC_Controller_ActionController {

	/**
	 * @var Tx_IfpCurriculum2_Domain_Repository_AnmeldungRepository
	 */
	protected $anmeldungRepository;

	/**
	 * @param Tx_IfpCurriculum2_Domain_Repository_AnmeldungRepository $anmeldungRepository
 	 * @return void
-	 */
	public function injectAnmeldungRepository(Tx_IfpCurriculum2_Domain_Repository_AnmeldungRepository $anmeldungRepository) {
		$this->anmeldungRepository = $anmeldungRepository;
	}



	/**
	 * Displays all Anmeldungs
	 *
	 * @return void
	 */
	public function listAction() {
		$anmeldungs = $this->anmeldungRepository->findMy();
		
		$this->view->assign('anmeldungs', $anmeldungs);
	}


	/**
	 * Displays a single Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 * @return string The rendered view
	 */
	public function showAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		
		$this->view->assign('anmeldung', $anmeldung);
	}
	


	/**
	 * Displays a form for creating a new  Anmeldung
	 * @param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @param Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer 
	 * @return void
	 * @dontvalidate $newAnmeldung
	 */
	public function newAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung = NULL,Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer= NULL) {
		if (!isset($GLOBALS['TSFE']->fe_user->user['uid'])&&!isset($teilnehmer)) {
			$this->redirect("new", "Teilnehmer",null, array("veranstaltung"=> $veranstaltung));
		}else{
			if($teilnehmer==null){
				$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
				$teilnehmer=$teilnehmerRepository->getTeilnehmer();
				$this->checkTeilnehmerData($teilnehmer);
			}
		}
		
		if(!$veranstaltung->isAnmeldungMoeglich()){
			$this->flashMessageContainer->add('Eine Anmeldung für diese Veranstaltung ist nicht mehr möglich. Bei Problemen bitte nehmen Sie Kontakt zu unserem Büro auf.');
			$this->redirect('list',"Veranstaltung");
					
		}
		if($this->anmeldungRepository->isAngemeldet($veranstaltung,$teilnehmer)){
			$this->flashMessageContainer->add('Sie sind bereits für diese Veranstaltung angemeldet.');
			$this->redirect('list',"Veranstaltung");
					
		}
		
		
		$this->view->assign('newAnmeldung', $newAnmeldung);
		$this->view->assign('teilnehmer', $teilnehmer);
		$this->view->assign('veranstaltung', $veranstaltung);
	}
	/**
	 * Displays a form for creating a new  Anmeldung
	 * @param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @return void
	 * @dontvalidate $newAnmeldung
	 */
	public function adminnewAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung = NULL) {
	
	
		$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
		$teilnehmers=$teilnehmerRepository->findAll();
		$teilnehmerarray=array();
		$teilnehmerarray[]="";
		foreach ($teilnehmers as $teilnehmer) {
				$teilnehmerarray[]=$teilnehmer;
		}
		
		
		$this->view->assign('newAnmeldung', $newAnmeldung);
		$this->view->assign('teilnehmer', $teilnehmerarray);
		$this->view->assign('veranstaltung', $veranstaltung);
	}
	
	/**
	 * Creates a new Anmeldung and forwards to the list action.
	 *@param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @return void
	 */
	public function createAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung,Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer) {
		
		if (!isset($GLOBALS['TSFE']->fe_user->user['uid'])&&!isset($teilnehmer)) {
			$this->redirect("new", "Teilnehmer",null, array("veranstaltung"=> $veranstaltung));
		}else{
			if($teilnehmer==null){
				$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
				$teilnehmer=$teilnehmerRepository->getTeilnehmer();
			}
		}
		if(!$veranstaltung->isAnmeldungMoeglich()){
			$this->flashMessageContainer->add('Eine Anmeldung für diese Veranstaltung ist nicht mehr möglich. Bei Problemen bitte nehmen Sie Kontakt zu unserem Büro auf.');
			$this->redirect('show',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );
								
		}
		if($this->anmeldungRepository->isAngemeldet($veranstaltung,$teilnehmer)){
			$this->flashMessageContainer->add('Sie sind bereits angemeldet.');
			$this->redirect('show',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );
								
		}
		$newAnmeldung->setVeranstaltung($veranstaltung);
		$newAnmeldung->setDefault();
		$newAnmeldung->setTeilnehmer($teilnehmer);
		$this->bestaetigungsMail($newAnmeldung);
		$this->anmeldungRepository->add($newAnmeldung);
		$this->flashMessageContainer->add('Vielen Dank für Ihre Anmeldung. Sie erhalten in den nächsten Minuten eine Bestätigung per Mail.');
		
		$this->redirect('show',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );
		
		
	}
	
	/**
	 * Creates a new Anmeldung and forwards to the list action.
	 *@param Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung zu welcher sich die person anmelden möchte
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung a fresh Anmeldung object which has not yet been added to the repository
	 * @return void
	 */
	public function admincreateAction(Tx_IfpCurriculum2_Domain_Model_Veranstaltung $veranstaltung,Tx_IfpCurriculum2_Domain_Model_Anmeldung $newAnmeldung) {
		if($this->request->hasArgument("teilnehmer")){
			if($this->request->getArgument("teilnehmer")!=0){
				$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
				$teilnehmer=$teilnehmerRepository->findbyUid($this->request->getArgument("teilnehmer"));
				$newAnmeldung->setTeilnehmer($teilnehmer);
				
			}
		}
		$newAnmeldung->setVeranstaltung($veranstaltung);
		$newAnmeldung->setDefault();
		if($this->anmeldungRepository->isAngemeldet($veranstaltung,$newAnmeldung->getTeilnehmer())){
			$this->flashMessageContainer->add('Der Teilnehmer wurde bereits angemeldet.');				
		}else{
			$this->bestaetigungsMail($newAnmeldung);
			$this->anmeldungRepository->add($newAnmeldung);
		}
		$this->redirect('adminshow',"Veranstaltung",null, array("veranstaltung"=> $veranstaltung) );
	}


	
	/**
	 * Displays a form for editing an existing Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 * @return string A form to edit a Anmeldung 
	 */
	public function editAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->checkUser($anmeldung->getTeilnehmer());
		
		$this->view->assign('anmeldung', $anmeldung);
	}
/**
 * @param Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer
 */
protected function checkUser(Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer){
				$teilnehmerRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_TeilnehmerRepository');
	
	$myTeilnehmer=$teilnehmerRepository->getTeilnehmer();
		if($myTeilnehmer->getUid()!=$teilnehmer->getUid()){
			$this->redirect("list");
		}
}


	/**
	 * Displays a form for editing an existing Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 * @return string A form to edit a Anmeldung 
	 */
	public function admineditAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {		
		$this->view->assign('anmeldung', $anmeldung);
	}
	
	/**
	 * Updates an existing Anmeldung and forwards to the list action afterwards.
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 */
	public function updateAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->checkUser($anmeldung->getTeilnehmer());
		if($this->request->hasArgument("storno")){
			if($this->request->getArgument("storno")=="storno"){
				$anmeldung->setStornierungszeitpunkt(new DateTime());
			}
		}
		$this->anmeldungRepository->update($anmeldung);
		$this->flashMessageContainer->add('Your Anmeldung was updated.');
		$this->redirect('list');
	}


			/**
	 * Deletes an existing Anmeldung
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to be deleted
	 * @return void
	 */
	public function deleteAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		$this->anmeldungRepository->remove($anmeldung);
		$this->flashMessageContainer->add('Your Anmeldung was removed.');
		$this->redirect('list');
	}
	/**
	 * Updates an existing Anmeldung and forwards to the list action afterwards.
	 *
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung the Anmeldung to display
	 */
	public function adminupdateAction(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		
		if($this->request->hasArgument("storno")){
			if($this->request->getArgument("storno")=="storno"){
				$anmeldung->setStornierungszeitpunkt(new DateTime());
			}
		}
		$this->anmeldungRepository->update($anmeldung);
		$this->flashMessageContainer->add('Die Anmeldung wurde aktuallisiert.');
		$this->redirect('adminshow',"Veranstaltung",null,array("veranstaltung"=>$anmeldung->getVeranstaltung()));
	}
	/**
	 * 
	 * Enter description here ...
	 * @param Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer
	 */
	protected function checkTeilnehmerData(Tx_IfpCurriculum2_Domain_Model_Teilnehmer $teilnehmer){
		
		if($teilnehmer->getGeschlecht()===NULL){
			$this->redirect('edit',"Teilnehmer");
		}
	}
/**
	 * 
	 * Enter description here ...
	 * @param  $data
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung
	 */
protected function bestaetigungsMail(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldung) {
		// create a Fluid instance for plain text rendering
		$renderer = $this->getPlainTextEmailRenderer('Buchungsbestaetigung');
		// assign the data to it
		$renderer->assign('anmeldung', $anmeldung);
		// and do the rendering magic
		$message = $renderer->render();
		echo $message;
		// finally, send the mail

		$this->sendMail($anmeldung->getTeilnehmer()->getMail(), 'Buchungsbestätigung für den Kurs '.$anmeldung->getVeranstaltung()->getTitel(), $message, 'info@ifp-potsdam.com', 'IfP-Potsdam Veranstaltungsbuchungsssytem');
	}
 
	protected function sendMail($recipient, $subject, $message, $senderEMail, $senderName='', $replyToEMail='', $replyToName='', $returnPath='', $organization='') {
		$htmlMail = t3lib_div::makeInstance('t3lib_htmlmail');
		$htmlMail->start();
		$htmlMail->recipient = $recipient;
		$htmlMail->subject = $subject;
		$htmlMail->from_email = $senderEMail;
		$htmlMail->from_name = $senderName;
		$htmlMail->replyto_email = $replyToEMail != '' ? $replyToEMail : $senderEMail;
		$htmlMail->replyto_name = $replyToName != '' ? $replyToName : $senderName;
		$htmlMail->organisation = $organisation;
		$htmlMail->returnPath = $returnPath;
		$htmlMail->addPlain($message);
		$htmlMail->send($recipient);
	}
 
	/**
	 * This creates another stand-alone instance of the Fluid view to render a plain text e-mail template
	 * @param string $templateName the name of the template to use
	 * @return Tx_Fluid_View_StandaloneView the Fluid instance
	 */
	protected function getPlainTextEmailRenderer($templateName = 'default') {
		$emailView = $this->objectManager->create('Tx_Fluid_View_StandaloneView');
		$emailView->setFormat('txt');
		$extbaseFrameworkConfiguration = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
		$templateRootPath = t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['templateRootPath']);
		$templatePathAndFilename = $templateRootPath . $this->request->getControllerName().'/' . $templateName . '.txt';
		$emailView->setTemplatePathAndFilename($templatePathAndFilename);
		$emailView->assign('settings', $this->settings);
		return $emailView;
	}

}
?>